package com.saianfu.flowable.demo.common

import org.flowable.engine.repository.*
import java.io.InputStream

/**
 * 流程定义封装
 */
interface ActProcess {
    /**
     * 创建流程部署对象
     *
     * @return
     */
    fun createDeployment(): DeploymentBuilder?

    /**
     * 创建流程部署查询对象
     *
     * @return
     */
    fun createDeploymentQuery(): DeploymentQuery?

    /**
     * 创建流程定义查询对象
     *
     * @return
     */
    fun createProcessDefinitionQuery(): ProcessDefinitionQuery?

    /**
     * 部署流程定义
     *
     * @param url 流程定义文件URL
     * @return
     */
    fun deploy(url: String): Deployment?

    /**
     * 部署流程定义---通过inputstream流
     *
     * @param name     流程模板文件名字
     * @param category 流程模板文件类别
     * @param in       流程模板文件流
     * @return
     */
    fun deploy(name: String, category: String, `in`: InputStream): Deployment?

    /**
     * 部署流程定义
     *
     * @param url    流程定义文件URL
     * @param pngUrl 流程定义文件pngUrl
     * @return
     */
    fun deploy(url: String, pngUrl: String?): Deployment?

    /**
     * 部署流程定义
     *
     * @param url    流程定义文件URL
     * @param drlUrl 规则引擎文件URL
     * @return
     */
    fun deployBpmnAndDrl(url: String, drlUrl: String): Deployment?

    /**
     * 部署流程定义
     *
     * @param url      流程定义文件URL
     * @param name     流程定义名称
     * @param category 流程定义类别
     * @return
     */
    fun deploy(url: String, name: String?, category: String?): Deployment?

    /**
     * 部署流程定义
     *
     * @param url      流程定义文件URL
     * @param pngUrl   流程定义文件pngUrl
     * @param name     流程定义标识
     * @param category 流程定义类别
     * @return
     */
    fun deploy(url: String, pngUrl: String?, name: String?, category: String?): Deployment?

    /**
     * 根据流程定义key，判断流程定义（模板）是否已经部署过
     *
     * @param processDefinitionKey 流程定义key（即：流程模板ID）
     * @return
     */
    fun exist(processDefinitionKey: String): Boolean

    /**
     * 根据流程定义key，查询流程定义信息
     *
     * @param processDefinitionKey 流程定义key（即：流程模板ID）
     * @return
     */
    fun queryByProcessDefinitionKey(processDefinitionKey: String): ProcessDefinition?
}